import magic
import os

class FileTypeChecker:
    # 支持的MIME类型和对应的文件扩展名
    ALLOWED_TYPES = {
        #图片
        'image/jpeg': ['.jpg', '.jpeg'],
        'image/png': ['.png'],
        'image/gif': ['.gif'],
        'image/webp': ['.webp'],
        'image/avif': ['.avif'],
        'image/bmp': ['.bmp'],
        'image/tiff': ['.tiff', '.tif'],
        'image/svg+xml': ['.svg'],
        'image/heic': ['.heic', '.heif'],   
        #视频
        'video/mp4': ['.mp4'],
        'video/avi': ['.avi'],
        'video/mov': ['.mov'],
        'video/wmv': ['.wmv'],
        'video/flv': ['.flv'],
        'video/webm': ['.webm'],    
        'video/mkv': ['.mkv'],
        'video/mpg': ['.mpg'],
        'video/mpeg': ['.mpeg'],
        'video/mp2': ['.mp2'],
        'video/mp3': ['.mp3'],
        #文档
        # 'application/pdf': ['.pdf'],
        # 'application/msword': ['.doc'],
        # 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': ['.docx'],
        # 'application/vnd.ms-excel': ['.xls'],
        # 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': ['.xlsx'],
        # 'application/vnd.ms-powerpoint': ['.ppt'],
        # 'application/vnd.openxmlformats-officedocument.presentationml.presentation': ['.pptx'],
        # 'application/vnd.ms-excel.sheet.macroEnabled.12': ['.xlsm'],
        # 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.macroEnabled.12': ['.xlsx'],
        # 'application/vnd.ms-powerpoint.presentation.macroEnabled.12': ['.pptm'],
        # 'application/vnd.openxmlformats-officedocument.presentationml.presentation.macroEnabled.12': ['.pptx'],
        # # 音频
        # 'audio/mpeg': ['.mp3'],
        # 'audio/wav': ['.wav'],
        # 'audio/ogg': ['.ogg'],
        # 'audio/aac': ['.aac'],
        # 'audio/flac': ['.flac'],
        # # 压缩包
        # 'application/zip': ['.zip'],
        # 'application/rar': ['.rar'],
        # 'application/7z': ['.7z'],
        # 'application/tar': ['.tar'],
        # 'application/gzip': ['.gz'],
        # 'application/bzip2': ['.bz2'],
        # 可以根据需要添加更多类型
    }

    # 定义最大文件大小（5GB）
    MAX_FILE_SIZE = 5 * 1024 * 1024 * 1024  # 5GB in bytes

    @staticmethod
    def check_file_type(file):
        """
        检查文件类型是否与扩展名匹配，并验证文件大小
        :param file: Django UploadedFile 对象
        :return: dict 包含验证结果的字典
        """
        # 检查文件大小
        if file.size > FileTypeChecker.MAX_FILE_SIZE:
            return {
                'is_valid': False,
                'message': f'文件大小超过限制,最大允许5GB,当前文件大小: {file.size / (1024*1024*1024):.2f}GB',
                'size': file.size
            }

        # 获取文件扩展名
        file_ext = os.path.splitext(file.name)[1].lower()
        
        # 使用python-magic检测文件类型
        mime_type = magic.from_buffer(file.read(2048), mime=True)
        # 重置文件指针
        file.seek(0)

        # 检查文件类型是否在允许列表中
        if mime_type not in FileTypeChecker.ALLOWED_TYPES:
            return {
                'is_valid': False,
                'message': f'不支持的文件类型: {mime_type}',
                'type': mime_type,
                'size': file.size
            }

        # 检查扩展名是否匹配
        if file_ext not in FileTypeChecker.ALLOWED_TYPES[mime_type]:
            return {
                'is_valid': False,
                'message': '文件类型与扩展名不匹配，可能存在安全风险',
                'type': mime_type,
                'size': file.size
            }

        return {
            'is_valid': True,
            'message': '文件类型验证通过',
            'type': mime_type,
            'size': file.size
        }